package com.chezai.client.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * Describe 密码加解密
 * Created by LZF on 2017/1/12.
 */
public class AESUtil {
    public static final String masterPassword = "1520148977512345";
    public static final String VIPARA = "1520148977501234";
    public static final String bm = "utf-8";

    /**
     * AES 加密
     *
     * @param content 明文
     * @return
     */
    public static String aesEncrypt(String content) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
        SecretKeySpec key = new SecretKeySpec(masterPassword.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(content.getBytes(bm));
        return byte2HexStr(encryptedData);

    }

    /**
     * AES 解密
     *
     * @param content 密文
     * @return
     */

    public static String aesDecrypt(String content) throws Exception {
        byte[] byteMi = str2ByteArray(content);
        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
        SecretKeySpec key = new SecretKeySpec(masterPassword.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte[] decryptedData = cipher.doFinal(byteMi);
        return new String(decryptedData, "utf-8");
    }

    /**
     * 字节数组转化为大写16进制字符串
     *
     * @param b
     * @return
     */
    private static String byte2HexStr(byte[] b) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < b.length; i++) {
            String s = Integer.toHexString(b[i] & 0xFF);
            if (s.length() == 1) {
                sb.append("0");
            }
            sb.append(s.toUpperCase());
        }

        return sb.toString();
    }

    /**
     * 16进制字符串转字节数组
     *
     * @param s
     * @return
     */
    private static byte[] str2ByteArray(String s) {
        int byteArrayLength = s.length() / 2;
        byte[] b = new byte[byteArrayLength];
        for (int i = 0; i < byteArrayLength; i++) {
            byte b0 = (byte) Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).intValue();
            b[i] = b0;
        }
        return b;
    }

    /**
     * 获取加密后的密码
     *
     * @param certPassword
     * @return
     */
    public static String getEncryptCertPassword(String certPassword) {
        try {
            if (certPassword.endsWith("000")) {
                String aesEncryp6 = AESUtil.aesEncrypt(certPassword.substring(0, 6));
                return aesEncryp6;
            } else {
                String aesEncryp12 = AESUtil.aesEncrypt(certPassword);
                return aesEncryp12;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}
